﻿<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory">附录 G. 事件表示：JSON事件</title>
<link rel="stylesheet" href="css/espertech.css" type="text/css">
	<meta xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" name="generator" content="DocBook XSL-NS Stylesheets V1.74.0">
		<meta xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" http-equiv="Content-Type" content="text/html; charset=UTF-8">
			<link rel="home" href="index.html" title="Esper参考文档">
				<link rel="up" href="index.html" title="Esper参考文档">
					<link rel="prev" href="appendix_eventrepoa.html" title="附录 F. 事件表示：对象数组(Object[])事件">
						<link rel="next" href="appendix_eventrepavro.html" title="附录 H. 事件表示：Avro事件(org.apache.avro.generic.GenericData.Record)">
</head>

<body>
	<p xmlns:d="http://docbook.org/ns/docbook" id="title">
		<a href="./index.html" class="site_href"><strong>www.espertech.com</strong></a> <a href="http://www.espertech.com/esper/esper-documentation/" class="doc_href"><strong>文档</strong></a>
	</p>
	<ul xmlns:d="http://docbook.org/ns/docbook" class="docnav">
		<li class="previous"><a accesskey="p" href="appendix_eventrepoa.html"><strong>上一页</strong></a></li>
		<li class="next"><a accesskey="n" href="appendix_eventrepavro.html"><strong>下一页</strong></a></li>
	</ul>
	<div class="appendix" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="appendix_eventrepjson"></a>附录 G. 事件表示：JSON事件</h2>
				</div>
			</div>
		</div>
		<a id="d0e61412" class="indexterm"></a><a id="d0e61415" class="indexterm"></a>
		<p>本节提供使用JSON表示事件的相关信息。</p>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="appendix_eventrepjson_overview"></a>G.1. 概述</h2>
					</div>
				</div>
			</div>
			<p>事件可以通过JSON格式的字符串值来表示。JSON事件的事件属性就是JSON对象的属性。</p>
			<p>使用JSON作为事件表示的优势包括：</p>
			<div class="itemizedlist">
				<ul>
					<li>
						<p>JSON简单、可靠且快速，常用于序列化和传输结构化数据。JSON支持多种编程语言和平台，并有RPC和文件表示形式。</p>
					</li>
					<li>
						<p>在EPL编译时，Esper EPL编译器会为特定的JSON事件类型生成高性能的JSON解析器，实现出色的解析性能。</p>
					</li>
					<li>
						<p>在EPL编译时，Esper EPL编译器会生成JSON事件类型属性的内部表示，支持无需文档遍历即可高速读取属性值，且内存效率高。</p>
					</li>
				</ul>
			</div>
			<p>与Map和对象数组事件类型类似，JSON事件类型参与全面的类型系统，可以消除使用Java类作为事件类型的需要。</p>
			<p>
				运行时可以通过<code class="literal">EPEventService</code>接口上的<code class="literal">sendEventJson(String json, String jsonEventTypeName)</code>方法处理格式化为JSON文档的字符串值事件。
			</p>
			<p>
				运行时不会验证JSON事件。您的应用程序必须确保JSON对象与<code class="literal">create json schema</code>中的模式声明匹配。
			</p>
			<p>给定的JSON事件类型只能有一个超类型，该超类型也必须是JSON事件类型。JSON超类型上可用的所有属性在类型本身也可用。此外，在EPL中使用JSON超类型的事件类型名称的任何地方，JSON子类型和子类型的子类型都匹配该表达式。</p>
			<p>
				Esper JSON解析器生成一个可供应用程序使用的事件对象。该事件对象实现了<code class="literal">JsonEventObject</code>接口（包<code class="literal">com.espertech.esper.common.client.json.util</code>）。<code class="literal">JsonEventObject</code>扩展了<code class="literal">Map&lt;String, Object&gt;</code>，允许您像使用任何Map一样使用源自JSON的事件对象。
			</p>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="appendix_eventrepjson_properties"></a>G.2. JSON事件类型</h2>
					</div>
				</div>
			</div>
			<p>
				为了对传入事件使用JSON，必须通过<code class="literal">create json schema</code> EPL语法使事件类型名称和JSON模式（如果可用）已知。请参阅<a class="xref" href="epl_clauses.html#epl_createschema" title="5.15. 声明事件类型：创建模式">第5.15节"声明事件类型：创建模式"</a>中的示例。
			</p>
			<p>
				如果您不想使用EPL <code class="literal">create json schema</code>定义字段，可以指定提供JSON模式的应用程序类。请参阅<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_customunderlingevent" title="G.10. 自定义JSON事件类">第G.10节"自定义JSON事件类"</a>。
			</p>
			<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="note">
				<h2>注意</h2>
				<div class="itemizedlist">
					<ul>
						<li>
							<p>
								JSON事件类型必须在EPL中使用<code class="literal">create json schema</code>定义。JSON事件类型不能预先配置。
							</p>
						</li>
						<li>
							<p>
								如果您不知道部分或全部事件属性，请按照<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_dynamic" title="G.6. JSON动态事件属性">第G.6节"JSON动态事件属性"</a>中的说明操作。
							</p>
						</li>
					</ul>
				</div>
			</div>
			<p>
				下面的代码片段定义了一个JSON事件类型，创建了一个JSON事件并将事件发送到运行时。示例定义了<code class="literal">CarLocUpdateEvent</code>事件类型。<code class="literal">@public</code>表示事件类型具有公共可见性，<code class="literal">@buseventtype</code>表示您的应用程序可以为此事件类型使用<code class="literal">sendEventJson</code>。
			</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema CarLocUpdateEvent(carId string, direction int)</pre>
			<p>
				<code class="literal">CarLocUpdateEvent</code>现在可以在语句中使用：
			</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select count(*) from CarLocUpdateEvent(direction = 1)#time(1 min)</pre>
			<p>发送事件的示例代码为：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">String event = "{" +
  "  \"carId\" : \"A123456\",\n" +
  "  \"direction\" : 1\n" +
  "}";
runtime.getEventService().sendEventJson(event, "CarLocUpdateEvent");</pre>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="appendix_eventrepjson_jsonobjectnesting"></a>G.3. JSON对象嵌套</h2>
					</div>
				</div>
			</div>
			<p>JSON允许对象嵌套在其他对象中。每个JSON对象本身可以包含更多的JSON对象或JSON对象数组。</p>
			<p>例如，考虑以下JSON文档：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ 
  "isbn": "123-456-222",  
  "author": 
    {
      "lastname": "Doe",
      "firstname": "Jane"
    },
  "editor": 
    {
      "lastname": "Smith",
      "firstname": "Jane"
    },
  "title": "The Ultimate Database Study Guide",  
  "category": ["Non-Fiction", "Technology"]
 }</pre>
			<p>
				<code class="literal">author</code>和<code class="literal">editor</code>对象是嵌套对象。请先定义嵌套对象的模式，然后定义基于嵌套模式的模式。
			</p>
			<p>定义模式如下：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">create json schema Names(lastname string, firstname string);
@public @buseventtype create json schema BookEvent(isbn string, author Names, editor Names, title string, category string[]);</pre>
			<p>
				此示例EPL输出isbn以及作者和编辑的姓氏，以及第一个类别（使用<code class="literal">sendEventJson(json, "BookEvent")</code>处理文档）：
			</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select isbn, author.lastname as authorName, editor.lastname as editorName, 
  category[0] as firstCategory from BookEvent</pre>
			<p>下一个示例JSON文档旨在演示嵌套对象和对象数组：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{
  "id": "0001",
  "type": "donut",
  "name": "Cake",
  "batters": 	
  {
    "machine": "machine A",
    "batter":
    [
      { "id": "1001", "type": "Regular" },
      { "id": "1002", "type": "Chocolate" },
      { "id": "1003", "type": "Blueberry" },
      { "id": "1004", "type": "Devil's Food" }
    ]
  },
  "topping":
  [
    { "id": "5001", "type": "None" },
    { "id": "5002", "type": "Glazed" },
    { "id": "5005", "type": "Sugar" },
    { "id": "5007", "type": "Powdered Sugar" }
  ]
}</pre>
			<p>定义模式如下：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">create json schema IdAndType(id string, type string);
create json schema Batters(machine string, batter IdAndType[]);
@public @buseventtype create json schema CakeEvent(id string, type string, name string, batters Batters, topping IdAndType[]);</pre>
			<p>
				以下EPL输出名称、batter机器、第一个batter的类型和第一个topping的类型、batters的数量以及蛋糕事件的toppings数量（使用<code class="literal">sendEventJson(json, "CakeEvent")</code>处理文档）：
			</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select name, batters.machine as batterMachine, batters.batter[0].type as firstBatterType,
  topping[0].type as firstToppingType, batters.batter.countOf() as countBatters,
  topping.countOf() as countToppings from CakeEvent</pre>
		</div>
		<div class="sect1" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h2 class="title"><a id="appendix_eventrepjson_types"></a>G.4. JSON支持的类型</h2>
					</div>
				</div>
			</div>
			<p>
				<code class="literal">create json schema</code> EPL指定每个事件属性的名称和类型。<code class="literal">create json schema</code>也可以不指定任何事件属性或仅指定所有可用事件属性的子集。当存在编译时未知的JSON属性时，请参阅<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_dynamic" title="G.6. JSON动态事件属性">第G.6节"JSON动态事件属性"</a>。
			</p>
			<p>下表显示了支持的类型并提供了更多信息的链接。下表未列出的类型不支持用于JSON事件类型。</p>
			<div class="table">
				<a id="d0e61585"></a>
				<p class="title">
					<b>表 G.1. 支持的JSON事件属性类型</b>
				</p>
				<div class="table-contents">
					<table summary="支持的JSON事件属性类型" border="1">
						<colgroup>
							<col>
								<col>
						</colgroup>
						<thead>
							<tr>
								<th>类型</th>
								<th>更多信息</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td>应用程序提供的类</td>
								<td>参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_appclass" title="G.5. JSON应用程序提供的类">第G.5节"JSON应用程序提供的类"</a></td>
							</tr>
							<tr>
								<td>bigdecimal, java.math.BigDecimal</td>
								<td>由<code class="literal">new BigDecimal</code>解析的数字类型；参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_numeric" title="G.4.1. 数字类型">第G.4.1节"数字类型"</a></td>
							</tr>
							<tr>
								<td>biginteger, java.math.BigInteger</td>
								<td>由<code class="literal">new BigInteger</code>解析的数字类型；参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_numeric" title="G.4.1. 数字类型">第G.4.1节"数字类型"</a></td>
							</tr>
							<tr>
								<td>byte, java.lang.Byte</td>
								<td>由<code class="literal">Byte.parseByte</code>解析的数字类型；参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_numeric" title="G.4.1. 数字类型">第G.4.1节"数字类型"</a></td>
							</tr>
							<tr>
								<td>boolean, java.lang.Boolean</td>
								<td>参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_boolean" title="G.4.2. 布尔类型">第G.4.2节"布尔类型"</a></td>
							</tr>
							<tr>
								<td>double, java.lang.Double</td>
								<td>由<code class="literal">Double.parseDouble</code>解析的数字类型；参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_numeric" title="G.4.1. 数字类型">第G.4.1节"数字类型"</a></td>
							</tr>
							<tr>
								<td>float, java.lang.Float</td>
								<td>由<code class="literal">Float.parseFloat</code>解析的数字类型；参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_numeric" title="G.4.1. 数字类型">第G.4.1节"数字类型"</a></td>
							</tr>
							<tr>
								<td>int, java.lang.Integer</td>
								<td>由<code class="literal">Integer.parseInt</code>解析的数字类型；参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_numeric" title="G.4.1. 数字类型">第G.4.1节"数字类型"</a></td>
							</tr>
							<tr>
								<td>long, java.lang.Long</td>
								<td>由<code class="literal">Long.parseLong</code>解析的数字类型；参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_numeric" title="G.4.1. 数字类型">第G.4.1节"数字类型"</a></td>
							</tr>
							<tr>
								<td>null</td>
								<td>不解析，始终为null的值。</td>
							</tr>
							<tr>
								<td>short, java.lang.Short</td>
								<td>由<code class="literal">Short.parseShort</code>解析的数字类型；参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_numeric" title="G.4.1. 数字类型">第G.4.1节"数字类型"</a></td>
							</tr>
							<tr>
								<td>string, java.lang.String, char, java.lang.Character</td>
								<td>参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_string" title="G.4.3. 字符串类型">第G.4.3节"字符串类型"</a></td>
							</tr>
							<tr>
								<td>java.util.Map</td>
								<td>表示任何非类型化的JSON对象。参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_map" title="G.4.4. Map类型用于保存非类型化JSON对象">第G.4.4节"Map类型用于保存非类型化JSON对象"</a></td>
							</tr>
							<tr>
								<td>Object[]</td>
								<td>表示任何非类型化的JSON数组。参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_objectarray" title="G.4.5. 对象数组类型用于保存非类型化JSON数组">第G.4.5节"对象数组类型用于保存非类型化JSON数组"</a></td>
							</tr>
							<tr>
								<td>Object</td>
								<td>表示任何非类型化的JSON值。参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_object" title="G.4.6. Object类型用于保存非类型化JSON值（任何JSON值）">第G.4.6节"Object类型用于保存非类型化JSON值（任何JSON值）"</a></td>
							</tr>
							<tr>
								<td>java.net.URI</td>
								<td>由<code class="literal">new URI(...)</code>解析
								</td>
							</tr>
							<tr>
								<td>java.net.URL</td>
								<td>由<code class="literal">new URL(...)</code>解析
								</td>
							</tr>
							<tr>
								<td>java.time.LocalDate</td>
								<td>由<code class="literal">LocalDate.parse</code>解析
								</td>
							</tr>
							<tr>
								<td>java.time.LocalDateTime</td>
								<td>由<code class="literal">LocalDateTime.parse</code>解析
								</td>
							</tr>
							<tr>
								<td>java.time.OffsetDateTime</td>
								<td>由<code class="literal">OffsetDateTime.parse</code>解析
								</td>
							</tr>
							<tr>
								<td>java.time.ZonedDateTime</td>
								<td>由<code class="literal">ZonedDateTime.parse</code>解析
								</td>
							</tr>
							<tr>
								<td>java.util.UUID</td>
								<td>由<code class="literal">UUID.fromString</code>解析
								</td>
							</tr>
						</tbody>
					</table>
					<p>
						数字类型、<code class="literal">string</code>类型、布尔类型和枚举类类型允许一维和二维数组。<code class="literal">Map</code>类型不支持数组，<code class="literal">Object</code>不支持二维数组。带有数组的模式示例是<code class="literal">create json schema MyEvent(prices bigdecimal[], intmatrix int[][])</code>。
					</p>
					<p>
						使用<code class="literal">[primitive]</code>指示EPL编译器使用原始值数组，例如<code class="literal">create json schema MyEvent(intarray int[primitive])</code>。
					</p>
					<p>
						所有事件属性的默认值为<code class="literal">null</code>。当JSON事件文档中不存在相同名称的JSON属性时，事件属性值为<code class="literal">null</code>。
					</p>
					<p>
						所有类型都允许<code class="literal">null</code> JSON值。
					</p>
				</div>
			</div>
			<br class="table-break">
				<div class="sect2" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title"><a id="appendix_eventrepjson_types_numeric"></a>G.4.1. 数字类型</h3>
							</div>
						</div>
					</div>
					<p>
						JSON解析器使用相关JVM类型的相应解析方法（参见JavaDoc），如上表所列，例如整数使用<code class="literal">Integer.parseInt</code>。如果无法解析值，则会产生异常。解析器允许所有数字类型的数字和字符串值JSON文本。事件属性类型始终是装箱类型（数组除外）。
					</p>
					<p>为了说明，假设以下模式：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema MyEvent(intValue int)</pre>
					<p>以下是一些示例JSON文档：</p>
					<div class="table">
						<a id="d0e61809"></a>
						<p class="title">
							<b>表 G.2. 带有整数类型值的示例JSON文档</b>
						</p>
						<div class="table-contents">
							<table summary="带有整数类型值的示例JSON文档" border="1">
								<colgroup>
									<col>
										<col>
								</colgroup>
								<thead>
									<tr>
										<th>示例JSON</th>
										<th>结果</th>
									</tr>
								</thead>
								<tbody>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "intValue": 1 }</pre></td>
										<td>事件具有<code class="literal">intValue</code>值为<code class="literal">1</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "intValue": "2" }</pre></td>
										<td>事件具有<code class="literal">intValue</code>值为<code class="literal">2</code>（允许字符串值）
										</td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "intValue": null }</pre></td>
										<td>事件具有<code class="literal">intValue</code>值为<code class="literal">null</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{}</pre></td>
										<td>事件具有<code class="literal">intValue</code>值为<code class="literal">null</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "intValue": "some text" }</pre></td>
										<td>JSON解析器异常</td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "intValue" : ...anything but above, such as JSON array or JSON object... }</pre></td>
										<td>事件具有<code class="literal">intValue</code>值为<code class="literal">null</code></td>
									</tr>
								</tbody>
							</table>
						</div>
					</div>
					<br class="table-break">
				</div>
				<div class="sect2" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title"><a id="appendix_eventrepjson_types_boolean"></a>G.4.2. 布尔类型</h3>
							</div>
						</div>
					</div>
					<p>
						JSON解析器解析<code class="literal">true</code>和<code class="literal">false</code>，以及字符串类型的<code class="literal">"true"</code>和<code class="literal">"false"</code>。事件属性类型始终为<code class="literal">Boolean</code>（原始布尔数组除外）。
					</p>
					<p>例如，假设以下模式：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema MyEvent(booleanValue boolean)</pre>
					<p>以下是一些示例JSON文档。</p>
					<div class="table">
						<a id="d0e61910"></a>
						<p class="title">
							<b>表 G.3. 带有布尔类型值的示例JSON文档</b>
						</p>
						<div class="table-contents">
							<table summary="带有布尔类型值的示例JSON文档" border="1">
								<colgroup>
									<col>
										<col>
								</colgroup>
								<thead>
									<tr>
										<th>示例JSON</th>
										<th>结果</th>
									</tr>
								</thead>
								<tbody>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "booleanValue": true }</pre></td>
										<td>事件具有<code class="literal">booleanValue</code>值为<code class="literal">true</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "booleanValue": false }</pre></td>
										<td>事件具有<code class="literal">booleanValue</code>值为<code class="literal">false</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "booleanValue": "true" }</pre></td>
										<td>事件具有<code class="literal">booleanValue</code>值为<code class="literal">true</code>（允许字符串'true'）
										</td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "booleanValue": "false" }</pre></td>
										<td>事件具有<code class="literal">booleanValue</code>值为<code class="literal">false</code>（允许字符串'false'）
										</td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "booleanValue": null }</pre></td>
										<td>事件具有<code class="literal">booleanValue</code>值为<code class="literal">null</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{}</pre></td>
										<td>事件具有<code class="literal">booleanValue</code>值为<code class="literal">null</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "booleanValue": "some text" }</pre></td>
										<td>JSON解析器异常</td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "booleanValue" : ...anything but above, such as JSON array or JSON object... }</pre></td>
										<td>事件具有<code class="literal">booleanValue</code>值为<code class="literal">null</code></td>
									</tr>
								</tbody>
							</table>
						</div>
					</div>
					<br class="table-break">
				</div>
				<div class="sect2" lang="en-US">
					<div class="titlepage">
						<div>
							<div>
								<h3 class="title"><a id="appendix_eventrepjson_types_string"></a>G.4.3. 字符串类型</h3>
							</div>
						</div>
					</div>
					<p>JSON解析器接受任何字符串类型、数字类型或布尔类型的值。对于字符类型的值，JSON解析器会获取第一个可用字符。</p>
					<p>假设模式如下：</p>
					<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema MyEvent(stringValue string)</pre>
					<p>为了展示行为，示例JSON如下：</p>
					<div class="table">
						<a id="d0e62019"></a>
						<p class="title">
							<b>表 G.4. 带有字符串类型值的示例JSON文档</b>
						</p>
						<div class="table-contents">
							<table summary="带有字符串类型值的示例JSON文档" border="1">
								<colgroup>
									<col>
										<col>
								</colgroup>
								<thead>
									<tr>
										<th>示例JSON</th>
										<th>结果</th>
									</tr>
								</thead>
								<tbody>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "stringValue": "abc" }</pre></td>
										<td>事件具有<code class="literal">stringValue</code>值为<code class="literal">"abc"</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "stringValue": 1 }</pre></td>
										<td>事件具有<code class="literal">stringValue</code>值为<code class="literal">"1"</code>（允许数字）
										</td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "stringValue": false }</pre></td>
										<td>事件具有<code class="literal">stringValue</code>值为<code class="literal">"false"</code>（允许布尔值）
										</td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "stringValue": null }</pre></td>
										<td>事件具有<code class="literal">stringValue</code>值为<code class="literal">null</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{}</pre></td>
										<td>事件具有<code class="literal">stringValue</code>值为<code class="literal">null</code></td>
									</tr>
									<tr>
										<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "stringValue" : ...anything but above, such as JSON array or JSON object... }</pre></td>
										<td>事件具有<code class="literal">stringValue</code>值为<code class="literal">null</code></td>
									</tr>
								</tbody>
							</table>
						</div>
					</div>
					<br class="table-break">
				</div>
		</div>
		<div class="sect2" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h3 class="title"><a id="appendix_eventrepjson_types_map"></a>G.4.4. Map类型用于保存非类型化JSON对象</h3>
					</div>
				</div>
			</div>
			<p>
				JSON解析器在遇到相同名称的JSON对象时，会填充一个<code class="literal">Map&lt;String, Object&gt;</code>，其中包含JSON对象属性及其嵌套值（深度）。解析器会忽略除对象外的任何其他JSON值类型。
			</p>
			<p>
				解析器生成的<code class="literal">Map&lt;String, Object&gt;</code>遵循下面动态属性的类型规则。
			</p>
			<p>定义一个如下模式：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema MyEvent(jsonObject java.util.Map)</pre>
			<p>下表包含示例JSON文档。</p>
			<div class="table">
				<a id="d0e62119"></a>
				<p class="title">
					<b>表 G.5. 带有非类型化JSON对象的示例JSON文档</b>
				</p>
				<div class="table-contents">
					<table summary="带有非类型化JSON对象的示例JSON文档" border="1">
						<colgroup>
							<col>
								<col>
						</colgroup>
						<thead>
							<tr>
								<th>示例JSON</th>
								<th>结果</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonObject": {} }</pre></td>
								<td>事件具有<code class="literal">jsonObject</code>值为空映射
								</td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonObject": { "property-one": 1, "property-two": "abc" }}</pre></td>
								<td>事件具有<code class="literal">jsonObject</code>映射类型值，包含两个条目：键<code class="literal">propertyOne</code>值为<code class="literal">1</code>（整数）和键<code class="literal">propertyTwo</code>值为<code class="literal">abc</code>（字符串）
								</td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonObject": null }</pre></td>
								<td>事件具有<code class="literal">jsonObject</code>值为<code class="literal">null</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{}</pre></td>
								<td>事件具有<code class="literal">jsonObject</code>值为<code class="literal">null</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonObject" : ...anything but an object... }</pre></td>
								<td>事件具有<code class="literal">jsonObject</code>值为<code class="literal">null</code></td>
							</tr>
						</tbody>
					</table>
				</div>
			</div>
			<br class="table-break">
		</div>
		<div class="sect2" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h3 class="title"><a id="appendix_eventrepjson_types_objectarray"></a>G.4.5. 对象数组类型用于保存非类型化JSON数组</h3>
					</div>
				</div>
			</div>
			<p>
				JSON解析器在遇到相同名称的JSON数组时，会填充一个对象数组<code class="literal">Object[]</code>，其中包含JSON数组值及其嵌套值（深度）。解析器会忽略除数组外的任何其他JSON值类型。
			</p>
			<p>
				解析器生成的<code class="literal">Object[]</code>遵循下面动态属性的规则。
			</p>
			<p>定义一个如下模式：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema MyEvent(jsonArray Object[])</pre>
			<p>示例JSON文档如下。</p>
			<div class="table">
				<a id="d0e62214"></a>
				<p class="title">
					<b>表 G.6. 带有非类型化数组的示例JSON文档</b>
				</p>
				<div class="table-contents">
					<table summary="带有非类型化数组的示例JSON文档" border="1">
						<colgroup>
							<col>
								<col>
						</colgroup>
						<thead>
							<tr>
								<th>示例JSON</th>
								<th>结果</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonArray": [] }</pre></td>
								<td>事件具有<code class="literal">jsonArray</code>值为空数组
								</td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonArray": [ "value-one", 1 ] }</pre></td>
								<td>事件具有<code class="literal">jsonArray</code>值对象数组<code class="literal">Object[]</code>类型值，包含两个值：字符串<code class="literal">value-one</code>和整数<code class="literal">1</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonArray": null }</pre></td>
								<td>事件具有<code class="literal">jsonArray</code>值为<code class="literal">null</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{}</pre></td>
								<td>事件具有<code class="literal">jsonArray</code>值为<code class="literal">null</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonArray" : ...anything but an array... }</pre></td>
								<td>事件具有<code class="literal">jsonArray</code>值为<code class="literal">null</code></td>
							</tr>
						</tbody>
					</table>
				</div>
			</div>
			<br class="table-break">
		</div>
		<div class="sect2" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h3 class="title"><a id="appendix_eventrepjson_types_object"></a>G.4.6. Object类型用于保存非类型化JSON值（任何JSON值）</h3>
					</div>
				</div>
			</div>
			<p>
				JSON解析器在遇到相同名称的任何JSON值时，将值作为对象<code class="literal">Object</code>提供，其中包含JSON值及其嵌套值（深度）。
			</p>
			<p>
				解析器生成的<code class="literal">Object</code>遵循下面动态属性的规则，例如JSON对象为<code class="literal">Map&lt;String, Object&gt;</code>，JSON数组为<code class="literal">Object[]</code>，其他对象值为所列类型。
			</p>
			<p>定义一个如下模式：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema MyEvent(jsonValue Object)</pre>
			<p>示例JSON文档如下：</p>
			<div class="table">
				<a id="d0e62311"></a>
				<p class="title">
					<b>表 G.7. 带有非类型化值的示例JSON文档</b>
				</p>
				<div class="table-contents">
					<table summary="带有非类型化值的示例JSON文档" border="1">
						<colgroup>
							<col>
								<col>
						</colgroup>
						<thead>
							<tr>
								<th>示例JSON</th>
								<th>结果</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonValue": {} }</pre></td>
								<td>事件具有<code class="literal">jsonValue</code>值为空映射，类型为<code class="literal">Map&lt;String, Object&gt;</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonValue": { "property-one": 1, "property-two": "abc" }}</pre></td>
								<td>事件具有<code class="literal">jsonValue</code>映射类型值，包含两个条目：键<code class="literal">propertyOne</code>值为<code class="literal">1</code>（整数）和键<code class="literal">propertyTwo</code>值为<code class="literal">abc</code>（字符串）
								</td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonValue": [] }</pre></td>
								<td>事件具有<code class="literal">jsonValue</code>值为空对象数组，类型为<code class="literal">Object[]</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonValue": [ "value-one", 1 ] }</pre></td>
								<td>事件具有<code class="literal">jsonValue</code>对象数组<code class="literal">Object[]</code>类型值，包含两个值：字符串<code class="literal">value-one</code>和整数<code class="literal">1</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonValue": 1 }</pre></td>
								<td>事件具有<code class="literal">jsonValue</code>值为<code class="literal">1</code>（整数）
								</td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonValue": "abc" }</pre></td>
								<td>事件具有<code class="literal">jsonValue</code>值为<code class="literal">abc</code>（字符串）
								</td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonValue": true }</pre></td>
								<td>事件具有<code class="literal">jsonValue</code>值为<code class="literal">true</code>（布尔值）
								</td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "jsonValue": null }</pre></td>
								<td>事件具有<code class="literal">jsonValue</code>值为<code class="literal">null</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{}</pre></td>
								<td>事件具有<code class="literal">jsonValue</code>值为<code class="literal">null</code></td>
							</tr>
						</tbody>
					</table>
				</div>
			</div>
			<br class="table-break">
		</div>
	</div>
	<div class="sect1" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="appendix_eventrepjson_appclass"></a>G.5. JSON应用程序提供的类</h2>
				</div>
			</div>
		</div>
		<div class="sect2" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h3 class="title"><a id="appendix_eventrepjson_appclass_publicfields"></a>G.5.1. 具有公共字段的类</h3>
					</div>
				</div>
			</div>
			<p>
				您的应用程序可以提供具有公共字段和默认构造函数的类。EPL编译器检查该类，并根据<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types" title="G.4. JSON支持的类型">第G.4节"JSON支持的类型"</a>中列出的类型和本文描述的类型确定类的解析器和序列化。
			</p>
			<p>
				如果您不想使用EPL <code class="literal">create json schema</code>定义字段，可以指定一个提供JSON模式的应用程序类。请参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_customunderlingevent" title="G.10. 自定义JSON事件类">第G.10节"自定义JSON事件类"</a>。
			</p>
			<p>为了说明，下面的类有两个字段，分别保存字符串类型的名称和UUID类型的id：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">public class Person {
  public String name;
  public UUID id;
}</pre>
			<p>
				下面的模式有一个<code class="literal">person</code>事件属性，类型为<code class="literal">Person</code>（下面的示例假设该类是导入的一部分；或者指定完全限定的类名）。
			</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema MyEvent(person Person)</pre>
			<p>示例JSON文档如下：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{
  "person": {
    "name": "Joe",
    "id": "ff362753-b20d-4a9f-9144-93919cb12442"
  }
}</pre>
			<p>JSON解析器支持，除了前面讨论的所有类型外，还包括以下内容：</p>
			<div class="itemizedlist">
				<ul>
					<li>
						<p>
							<code class="literal">List</code> 应用程序类或其他类型。例如：<code class="literal">public List&lt;Person&gt; persons</code>。
						</p>
					</li>
					<li>
						<p>
							一维和二维数组。例如：<code class="literal">public Person[] persons</code> 或 <code class="literal">public Person[][] personMatrix</code>。
						</p>
					</li>
					<li>
						<p>
							要自定义字符串的解析，请参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_custom" title="G.9. 自定义JSON序列化和反序列化">第G.9节"自定义JSON序列化和反序列化"</a>。
						</p>
					</li>
				</ul>
			</div>
		</div>
		<div class="sect2" lang="en-US">
			<div class="titlepage">
				<div>
					<div>
						<h3 class="title"><a id="appendix_eventrepjson_appclass_enum"></a>G.5.2. 应用程序提供的枚举类型</h3>
					</div>
				</div>
			</div>
			<p>
				JSON解析器获取JSON值并调用枚举类的<code class="literal">valueOf</code>方法，允许字符串和数字值，对于JSON布尔值、数组或对象值返回null。
			</p>
			<p>假设模式如下：</p>
			<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema MyEvent(enumValue my.company.package.EnumClass)</pre>
			<p>为了展示行为，示例JSON如下：</p>
			<div class="table">
				<a id="d0e62516"></a>
				<p class="title">
					<b>表 G.8. 带有枚举类型值的示例JSON文档</b>
				</p>
				<div class="table-contents">
					<table summary="带有枚举类型值的示例JSON文档" border="1">
						<colgroup>
							<col>
								<col>
						</colgroup>
						<thead>
							<tr>
								<th>示例JSON</th>
								<th>结果</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "enumValue": "enum_1" }</pre></td>
								<td>事件具有<code class="literal">enumValue</code>值为<code class="literal">EnumClass.valueOf("enum_1")</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "enumValue": null }</pre></td>
								<td>事件具有<code class="literal">enumValue</code>值为<code class="literal">null</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "enumValue": 1}</pre></td>
								<td>事件具有<code class="literal">enumValue</code>值为<code class="literal">EnumClass.valueOf("1")</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "enumValue": false}</pre></td>
								<td>事件具有<code class="literal">enumValue</code>值为<code class="literal">null</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{}</pre></td>
								<td>事件具有<code class="literal">enumValue</code>值为<code class="literal">null</code></td>
							</tr>
							<tr>
								<td><pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{ "enumValue" : ...anything but a value... }</pre></td>
								<td>事件具有<code class="literal">enumValue</code>值为<code class="literal">null</code></td>
							</tr>
						</tbody>
					</table>
				</div>
			</div>
			<br class="table-break">
		</div>
	</div>
	<div class="sect1" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="appendix_eventrepjson_dynamic"></a>G.6. JSON动态事件属性</h2>
				</div>
			</div>
		</div>
		<p>
			可以预先知道的事件属性可以作为<code class="literal">create json schema</code>的一部分列出。由于名称和类型已知，EPL编译器可以验证在表达式中使用预定义属性的EPL语句。参见<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types" title="G.4. JSON支持的类型">第G.4节"JSON支持的类型"</a>。
		</p>
		<p>
			属性名称已知但类型未知的事件属性可以定义为非类型化类型之一<code class="literal">Object</code>（对于任何JSON值）、<code class="literal">Object[]</code>（对于任何JSON数组）或<code class="literal">Map</code>（对于任何JSON对象），这将提供嵌套值、数组和对象；例如在<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types_object" title="G.4.6. Object类型用于保存非类型化JSON值（任何JSON值）">第G.4.6节"Object类型用于保存非类型化JSON值（任何JSON值）"</a>中描述。
		</p>
		<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="note">
			<h2>注意</h2>
			<p>
				默认情况下，JSON解析器会丢弃属性名称与<code class="literal">create schema</code>中属性名称不匹配的JSON属性。
			</p>
			<p>
				必须使用<code class="literal">@JsonSchema(dynamic=true)</code>来指示EPL编译器不要丢弃JSON属性。
			</p>
		</div>
		<p>
			将<code class="literal">@JsonSchema(dynamic=true)</code>添加到<code class="literal">create schema</code>中，以便JSON解析器解析并且事件对象保留JSON文档中所有可用的属性。
		</p>
		<p>
			EPL动态属性允许在表达式中使用未预定义的属性。请参阅<a class="xref" href="event_representation.html#eventrep-dyncproperties" title="3.3. 动态事件属性">第3.3节"动态事件属性"</a>。动态JSON属性也可在<code class="literal">JsonEventObject</code>事件对象中供应用程序代码使用。
		</p>
		<p>下表概述了每个JSON值的对象类型：</p>
		<div class="table">
			<a id="d0e62646"></a>
			<p class="title">
				<b>表 G.9. JSON值类型到对象类型的映射</b>
			</p>
			<div class="table-contents">
				<table summary="JSON值类型到对象类型的映射" border="1">
					<colgroup>
						<col>
							<col>
					</colgroup>
					<thead>
						<tr>
							<th>JSON值类型</th>
							<th>对象类型</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td>JSON字符串</td>
							<td>String</td>
						</tr>
						<tr>
							<td>JSON数字</td>
							<td><code class="literal">Integer.parseInt</code>返回的整数值或<code class="literal">Double.parseDouble</code>返回的双精度值</td>
						</tr>
						<tr>
							<td>JSON布尔值</td>
							<td>Boolean</td>
						</tr>
						<tr>
							<td>JSON Null</td>
							<td>null</td>
						</tr>
						<tr>
							<td>JSON对象</td>
							<td><code class="literal">Map&lt;String, Object&gt;</code></td>
						</tr>
						<tr>
							<td>JSON数组</td>
							<td><code class="literal">Object[]</code></td>
						</tr>
					</tbody>
				</table>
			</div>
		</div>
		<br class="table-break">
			<p>下面的EPL为传感器事件创建一个空模式：</p> <pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@JsonSchema(dynamic=true) @public @buseventtype create json schema SensorEvent()</pre>
			<p>
				示例JSON文档如下（使用<code class="literal">sendEventJson(json, "SensorEvent")</code>处理文档）：
			</p> <pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{
"entityID":"cd9f930e",
"temperature" : 70,
"status" : true,
"entityName":{
  "english":"Cooling Water Temperature"
},
"vt":["2014-08-20T15:30:23.524Z"],
"flags" : null
}</pre>
			<p>可以使用动态属性查询事件。具体来说，以下是检索属性的EPL：</p> <pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select entityID? as entityId, temperature? as temperature, status? as status, 
    entityName? as entityName, vt? as vt, flags? as flags from SensorEvent</pre>
			<p>此示例的输出事件为：</p>
			<div class="table">
				<a id="d0e62713"></a>
				<p class="title">
					<b>表 G.10. 空JSON模式示例输出事件</b>
				</p>
				<div class="table-contents">
					<table summary="空JSON模式示例输出事件" border="1">
						<colgroup>
							<col>
								<col>
									<col>
						</colgroup>
						<thead>
							<tr>
								<th>名称</th>
								<th>类型</th>
								<th>值</th>
							</tr>
						</thead>
						<tbody>
							<tr>
								<td>entityId</td>
								<td>String</td>
								<td>"cd9f930e"</td>
							</tr>
							<tr>
								<td>temperature</td>
								<td>Integer</td>
								<td>70</td>
							</tr>
							<tr>
								<td>status</td>
								<td>Boolean</td>
								<td>true</td>
							</tr>
							<tr>
								<td>entityName</td>
								<td>map</td>
								<td><code class="literal">Map&lt;String, Object&gt;</code>包含键<code class="literal">english</code>和字符串类型值<code class="literal">Cooling Water Temperature</code>的单个条目</td>
							</tr>
							<tr>
								<td>vt</td>
								<td><code class="literal">Object[]</code></td>
								<td>具有单个字符串类型值<code class="literal">2014-08-20T15:30:23.524Z</code>的数组
								</td>
							</tr>
							<tr>
								<td>flags</td>
								<td>null</td>
								<td>null</td>
							</tr>
						</tbody>
					</table>
				</div>
			</div> <br class="table-break">
				<p>
					使用点（<code class="literal">'.'</code>）获取嵌套动态属性的值。例如：
				</p> <pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select entityName?.english as englishEntityName from SensorEvent</pre>
				<p>
					使用<code class="literal">select *</code>获取<code class="literal">JsonEventObject</code>对象本身（接收<code class="literal">EventBean</code>的监听器使用<code class="literal">getUnderlying()</code>）。例如：
				</p> <pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">select * as englishEntityName from SensorEvent</pre>
				<p>
					可以将<code class="literal">@JsonSchema(dynamic=true)</code>与预定义属性一起使用。例如：
				</p> <pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@JsonSchema(dynamic=true) @public @buseventtype create json schema SensorEvent(entityID string)</pre>
	</div>
	<div class="sect1" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="appendix_eventrepjson_parsing"></a>G.7. 解析JSON文档的API</h2>
				</div>
			</div>
		</div>
		<p>Esper提供了一个API来解析JSON文本而无需处理事件。这通过以下步骤完成：</p>
		<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="orderedlist">
			<ol>
				<li>
					<p>定义事件类型模式或模式。事件类型必须具有公共可见性和总线事件类型可见性。</p>
				</li>
				<li>
					<p>
						获取事件类型的<code class="literal">EventSenderJson</code>实例。
					</p>
				</li>
				<li>
					<p>
						调用发送器上的<code class="literal">parse</code>方法，返回填充的事件对象。
					</p>
				</li>
			</ol>
		</div>
		<p>
			例如，下面的EPL声明了<code class="literal">CarLocUpdateEvent</code>事件类型：
		</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype create json schema CarLocUpdateEvent(carId string, direction int)</pre>
		<p>
			获取<code class="literal">EventSenderJson</code>如下：
		</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">EventSenderJson sender = (EventSenderJson) runtime.getEventService().getEventSender("CarLocUpdateEvent");</pre>
		<p>
			<code class="literal">parse</code>方法返回填充的事件对象。
		</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">JsonEventObject eventObject = sender.parse(json);</pre>
		<p>
			返回的对象实现了<code class="literal">JsonEventObject</code>接口，该接口扩展了<code class="literal">Map&lt;String, Object&gt;</code>。该接口提供了用于写入JSON的附加方法。请参阅JavaDoc以获取更多信息。
		</p>
	</div>
	<div class="sect1" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="appendix_eventrepjson_minimaljsonapi"></a>G.8. 构建JSON文档的API</h2>
				</div>
			</div>
		</div>
		<p>
			Esper在包<code class="literal">com.espertech.esper.common.client.json.minimaljson</code>中包含了一个MinimalJson库的副本（MIT许可证，参见https://github.com/ralfstx/minimal-json/blob/master/LICENSE）。MinimalJson提供了基础解析器。Esper EPL编译器生成一个特定的JSON解析器类，内部使用MinimalJson。
		</p>
		<p>MinimalJson允许您的应用程序使用API构建JSON文本。请查阅JavaDoc以获取更多信息。下面提供了一个简短的示例：</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">JsonObject jsonObject = new JsonObject().add("carId", "A123456").add("direction", 1);
String json = jsonObject.toString();</pre>
	</div>
	<div class="sect1" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="appendix_eventrepjson_custom"></a>G.9. 自定义JSON序列化和反序列化</h2>
				</div>
			</div>
		</div>
		<p>
			使用<code class="literal">@JsonSchemaField</code>注解来自定义运行时如何反序列化（从JSON解析）给定事件属性以及序列化（写入为JSON）给定事件属性。
		</p>
		<p>
			<code class="literal">@JsonSchemaField</code>注解可以与<code class="literal">create json schema</code>一起使用，也适用于<code class="literal">@EventRepresentation('json')</code>，用于<code class="literal">insert into</code>或<code class="literal">create window</code>。
		</p>
		<p>
			<code class="literal">@JsonSchemaField</code>的<code class="literal">name</code>值提供事件属性名称。<code class="literal">adapter</code>属性提供实现<code class="literal">JsonFieldAdapterString</code>接口的类的类名。适配器类必须具有默认构造函数，并且必须实现<code class="literal">T parse(String value)</code>和<code class="literal">void write(T value, JsonWriter writer) throws IOException</code>方法。
		</p>
		<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="note">
			<h2>注意</h2>
			<p>适配器实现必须是线程安全的，运行时可能会重用相同的适配器实例。</p>
		</div>
		<p>
			假设一个JSON文档有一个日期类型字段，格式为<code class="literal">dd-M-yyyy</code>。下面的示例JSON模式。假设<code class="literal">MyDateJSONParser</code>类已添加到导入中。您可以指定完全限定的类名，即<code class="literal">adapter='com.mycompany.MyDateJSONParser'</code>。
		</p>
		<p>以下是示例EPL：</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@JsonSchemaField(name=myDate, adapter=MyDateJSONParser)
create json schema JsonEvent(myDate Date)</pre>
		<p>一个基本的JSON文档是：</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{"myDate" : "22-09-2018"}</pre>
		<p>下面的类是一个日期值的示例解析器和写入器：</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">public class MyDateJSONParser implements JsonFieldAdapterString&lt;Date&gt; {
  public Date parse(String value) {
    try {
      return value == null ? null : new SimpleDateFormat("dd-M-yyyy").parse(value);
    } catch (ParseException e) {
      throw new EPException("Failed to parse: " + e.getMessage(), e);
    }
  }

  public void write(Date value, JsonWriter writer) throws IOException {
    if (value == null) {
      writer.writeLiteral("null");
      return;
    }
    writer.writeString(new SimpleDateFormat("dd-M-yyyy").format(value));
  }
}</pre>
	</div>
	<div class="sect1" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="appendix_eventrepjson_customunderlingevent"></a>G.10. 自定义JSON事件类</h2>
				</div>
			</div>
		</div>
		<p>
			无需在EPL <code class="literal">create json schema</code>中提供事件属性名称和类型，您可以指定一个提供公共字段的应用程序类。您必须在<code class="literal">JsonSchema</code>注解的<code class="literal">classname</code>注解值中提供类名。
		</p>
		<p>假设有一个预定义的人员事件类，该类有两个字段，分别保存字符串类型的名称和UUID类型的id：</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">public class PersonEvent {
  public String name;
  public UUID id;
}</pre>
		<p>
			此示例声明JSON人员事件指向<code class="literal">PersonEvent</code>作为事件对象（下面的示例假设该类是导入的一部分；或者指定完全限定的类名）。
		</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">@public @buseventtype @JsonSchema(className='PersonEvent') create json schema JSONPersonEvent()</pre>
		<p>示例JSON文档如下：</p>
		<pre xmlns="" xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="">{
  "name": "Joe",
  "id": "ff362753-b20d-4a9f-9144-93919cb12442"
}</pre>
		<p>
			请参阅<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_appclass" title="G.5. JSON应用程序提供的类">第G.5节"JSON应用程序提供的类"</a>以获取应用程序类支持，以及<a class="xref" href="appendix_eventrepjson.html#appendix_eventrepjson_types" title="G.4. JSON支持的类型">第G.4节"JSON支持的类型"</a>以获取类型信息。
		</p>
		<p>通过指定应用程序类，您不能：</p>
		<div class="itemizedlist">
			<ul>
				<li>
					<p>为模式定义与应用程序类提供的名称和类型不同的附加字段。</p>
				</li>
				<li>
					<p>为事件类型定义超类型。</p>
				</li>
				<li>
					<p>
						使用<code class="literal">dynamic</code>标志。
					</p>
				</li>
			</ul>
		</div>
	</div>
	<div class="sect1" lang="en-US">
		<div class="titlepage">
			<div>
				<div>
					<h2 class="title"><a id="appendix_eventrepjson_limitations"></a>G.11. 限制</h2>
				</div>
			</div>
		</div>
		<p>以下限制适用：</p>
		<div xmlns:d="http://docbook.org/ns/docbook" xmlns:rf="java:org.jboss.highlight.XhtmlRendererFactory" class="orderedlist">
			<ol>
				<li>
					<p>
						JSON事件bean不能包含<code class="literal">EventBean</code>实例。
					</p>
				</li>
				<li>
					<p>虽然EPL编译器执行尽力而为的赋值检查和扩展，但它本身并不验证JSON是否包含有效数据，无论是生成JSON还是消费JSON。</p>
				</li>
				<li>
					<p>
						没有API将JSON文档映射到您自己的应用程序类。对于该任务，请考虑使用Jackson（<code class="literal">https://github.com/FasterXML/jackson</code>）或Gson（<code class="literal">https://github.com/google/gson</code>）。
					</p>
				</li>
				<li>
					<p>JSON解析器在遇到重复属性名称时，使用最后一个值作为最终值。</p>
				</li>
			</ol>
		</div>
	</div>
	<ul xmlns:d="http://docbook.org/ns/docbook" class="docnav">
		<li class="previous"><a accesskey="p" href="appendix_eventrepoa.html"><strong>上一页</strong>附录 F. 事件表示：对象数组(O...</a></li>
		<li class="up"><a accesskey="u" href="#"><strong>返回顶部</strong></a></li>
		<li class="home"><a accesskey="h" href="index.html"><strong>首页</strong></a></li>
		<li class="next"><a accesskey="n" href="appendix_eventrepavro.html"><strong>下一页</strong>附录 H. 事件表示：Avro事件(或...</a></li>
	</ul>
</body>

</html>